Para o Python, módulos são arquivos fonte que podem importados para um programa. Podem conter qualquer estrutura do Python e são executados quando importados. Eles são compilados quando importados pela primeira vez e armazenados em arquivo (com extensão “.pyc” ou “.pyo”), possuem namespace próprio e aceitam Doc Strings. São objetos Singleton (é carregada somente uma instância em memória, que fica disponível de forma global para o programa).
Os módulos são localizados pelo interpretador através da lista de pastas PYTHONPATH
(sys.path), que normalmente inclui a pasta corrente em primeiro lugar.
Os módulos são carregados através da instrução import
. Desta forma, ao usar alguma estrutura do módulo, é necessário identificar o módulo. Isto é chamado de importação absoluta.
In [1]:
import os
print os.name
Também é possível importar módulos de forma relativa:
In [2]:
from os import name
print name
Por evitar problemas, como a ofuscação de variáveis, a importação absoluta é considerada uma prática de programação melhor do que a importação relativa.
Exemplo de módulo:
In [ ]:
# Arquivo calc.py
# Função definida no módulo
def media(lista):
return float(sum(lista)) / len(lista)
Exemplo de uso do módulo:
In [4]:
# Importa o módulo calc
import calc
l = [23, 54, 31, 77, 12, 34]
# Chamada a função definida em calc
print calc.media(l)
O módulo principal de um programa tem a variável __name__
igual à __main__
, então é possível testar se o módulo é o principal usando:
In [6]:
if __name__ == "__main__":
# Aqui o código só será executado
# se este for o módulo principal
# e não quando ele for importado por outro programa
pass
Com isso é fácil transformar um programa em um módulo.
Outro exemplo de módulo:
In [ ]:
"""
modutils => rotinas utilitárias para módulos
"""
import os.path
import sys
import glob
def find(txt):
"""encontra módulos que tem o nome
contendo o parâmetro
"""
resp = []
for path in sys.path:
mods = glob.glob('%s/*.py' % path)
for mod in mods:
if txt in os.path.basename(mod):
resp.append(mod)
return resp
Exemplo de uso do módulo:
In [7]:
from os.path import getsize, getmtime
from time import localtime, asctime
import modutils
mods = modutils.find('xml')
for mod in mods:
tm = asctime(localtime(getmtime(mod)))
kb = getsize(mod) / 1024
print '%s: (%d kbytes, %s)' % (mod, kb, tm)
Dividir programas em módulos facilita o reaproveitamento e localização de falhas no código.
In [1]:
Out[1]: